import java.sql.Time;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.*;

public class Demo20 {
	public static void main(String[] args) {
		ExecutorService service= Executors.newCachedThreadPool();
		//自适应线程的数量，当线程结束后并不着急进行销毁，留着放下次使用
		ExecutorService service1=Executors.newFixedThreadPool(4);
		//固定的线程数量
		ExecutorService service2=Executors.newSingleThreadExecutor();
		//单个线程
		ExecutorService service3=Executors.newScheduledThreadPool(4);
		//相当于定时器，不是有一个线程，来进行扫描，而是由多个线程进行扫描
	}
}
class MyThreadPool{
	/**
	 * 首先我们需要一个存放任务的队列 ，队列的类型是Runnable类型
	 * 再执行任务时候需要先将任务存放里面
	 * 然后在我们需要的时候将任务取出来，然后再进行执行
	 */
	private BlockingQueue<Runnable> queue=new ArrayBlockingQueue<>(4);
	public void sumbit(Runnable runnable) throws InterruptedException {
		//这里我们采用的是第五种策略，阻塞等待策略
		queue.put(runnable);
	}

	public MyThreadPool(int n) {
		Thread t1=new Thread(()->{
			for(int i =0;i<n;i++) {
				try {
					Runnable runnable=queue.take();
					runnable.run();
				} catch (InterruptedException e) {
					throw new RuntimeException(e);
				}
			}
		});
		t1.start();
	}

	public static void main(String[] args) throws InterruptedException {
		MyThreadPool pool=new MyThreadPool(4);
		for(int i = 0;i<4;i++) {
			int id=i;
			pool.sumbit(new Runnable() {
				@Override
				public void run() {
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						throw new RuntimeException(e);
					}
					System.out.println("任务编号："+id);
				}
			});
		}
	}
}
